// Pannel meter software A2 #include "msp430G2553.h" #include "math.h" #define Clear 0x00 #define D4 BIT2 // LCD bits definition #define D5 BIT3 #define D6 BIT4 #define D7 BIT5 #define RS BIT0 #define EN BIT1 #define vector_char [0x01,0x02,0x03,'a'] int array_div_mod[5]; long IntVolt,IntCur; int temp2,i,n,delay,tenthsc,unitsc,decimal1c,decimal2c,decimal3c,tenthsv,unitsv,decimal1v,decimal2v,menu,menu_ps,buton,rotE; float med1,med2,med3,med4,med5,med6,med7,med8,med9,med10,med11,med12,med13,med14,med15,med16,med17,med18,med19,med20; float med1c,med2c,med3c,med4c,med5c,med6c,med7c,med8c,med9c,med10c,med11c,med12c,med13c,med14c,med15c,med16c,med17c,med18c,med19c,med20c; float volt_val_c,cur_val_c,volt_val,cur_val,ref_temp_val,reference_volt,reference_cur; float convert_volt(float),convert_cur(float); float bucla_div_mod(float); void move_cursor_xy(int,int); void configure_lcd(int); void display_char(unsigned char); int delay_time(int); int delay_long(int); int strobe_data_p2(int); int cls(int); int draw_Logo(int); int draw_SW_version(int); int draw_sub_ps(int); void main(void){ WDTCTL = WDTPW + WDTHOLD; // disable watch dog timer DCOCTL = CALDCO_16MHZ; // set internal oscillator at 16MHz BCSCTL1 = CALBC1_16MHZ; // set internal oscillator at 16MHz P1DIR = 0x0C; // 0000 1100 P2DIR = 0xFF; P1OUT = 0x00; P2OUT = 0x00; //--------------------config ADC ADC10CTL1 |= INCH_6; //continuous sample mode, CH6 // CONSEQ1 + INCH_6 ADC10CTL0 |= ADC10SHT_2 + ADC10ON + MSC; //sample and hold time, adc on, cont. sample ADC10AE0 |= 0x40; // select channel A6 ADC10CTL0 |= ADC10SC + ENC; // start conversions delay = 5000; configure_lcd(0); draw_Logo(0); delay = 2000; cls(0); draw_sub_ps(0); for(;;) { n = 250; //------------------------------------------------------------ bucla citire tensiune si curent do{ //---------------------------------------------------------------citire tensiune ADC10CTL1 &= ~(INCH_7); //disable continuous sample mode, CH7 ADC10CTL1 |= INCH_6; //continuous sample mode, CH6 ADC10AE0 |= 0x40; // select channel A6 //0100 0000 ADC10CTL0 |= ADC10SC + ENC; // start conversions delay_time(50); IntVolt = ADC10MEM; //-----------------------------------------------------------------citire curent ADC10CTL0 &= ~(ADC10SC + ENC); // stop conversions ADC10CTL1 &= ~(INCH_6); //disable continuous sample mode, CH6 ADC10CTL1 |= INCH_7; //continuous sample mode, CH7 ADC10AE0 |= 0x80; // select channel A7 //1000 0000 ADC10CTL0 |= ADC10SC + ENC; // start conversions delay_time(50); IntCur = ADC10MEM; ADC10CTL0 &= ~(ADC10SC + ENC); // stop conversions volt_val_c = convert_volt (IntVolt); cur_val_c = convert_cur (IntCur); //-----------------------------------------------------medie aritmetica tensiune if (IntVolt > 0x00){ med1 = med2; med2 = med3; med3 = med4; med4 = med5; med5 = med6; med6 = med7; med7 = med8; med8 = med9; med9 = med10; med10 = med11; med11 = med12; med12 = med13; med13 = med14; med14 = med15; med15 = med16; med16 = med17; med17 = med18; med18 = med19; med19 = med20; med20 = volt_val_c; } volt_val = (med1+med2+med3+med4+med5+med6+med7+med8+med9+med10+med11+med12+med13+med14+med15+med16+med17+med18+med19+med20)/20; //-------------------------------------------------------medie aritmetica curent if (IntCur > 0x00){ med1c = med2c; med2c = med3c; med3c = med4c; med4c = med5c; med5c = med6c; med6c = med7c; med7c = med8c; med8c = med9c; med9c = med10c; med10c = med11c; med11c = med12c; med12c = med13c; med13c = med14c; med14c = med15c; med15c = med16c; med16c = med17c; med17c = med18c; med18c = med19c; med19c = med20c; med20c = cur_val_c; } cur_val = (med1c+med2c+med3c+med4c+med5c+med6c+med7c+med8c+med9c+med10c)/10; n--; }while (n != 0); //--------------------------------------------------sfarsit bucla citire tensiune si curent //-------------------------------------- Loop for div/mod Voltage Values bucla_div_mod(volt_val); tenthsv = array_div_mod[0]; unitsv = array_div_mod[1]; decimal1v = array_div_mod[2]; decimal2v = array_div_mod[3]; //--------------------------------------- Loop for div/mod Current Values bucla_div_mod(cur_val); tenthsc = array_div_mod[0]; unitsc = array_div_mod[1]; decimal1c = array_div_mod[2]; decimal2c = array_div_mod[3]; decimal3c = array_div_mod[4]; //-------------------------------------------------------------- display values move_cursor_xy(2,2); display_char(tenthsv + 0x30); display_char(unitsv + 0x30); display_char('.'); display_char(decimal1v + 0x30); display_char(decimal2v + 0x30); move_cursor_xy(10,2); display_char(unitsc + 0x30); display_char('.'); display_char(decimal1c + 0x30); display_char(decimal2c + 0x30); display_char(decimal3c + 0x30); move_cursor_xy(17,2); delay_time(5000); delay_time(5000); delay_time(5000); delay_time(5000); delay_time(5000); delay_time(5000); delay_time(5000); delay_time(5000); delay_time(5000); delay_time(5000); delay_time(5000); delay_time(5000); delay_time(5000); delay_time(5000); delay_time(5000); delay_time(5000); } } //---------------------------------------------------------------------------------------------------------------------------------- //----------------- PROCEDURI ----------- PROCEDURI ----------- PROCEDURI ----------- PROCEDURI ----------- PROCEDURI ---- //---------------------------------------------------------------------------------------------------------------------------------- int delay_time (int delay){ //----------------------------------------- Delay--------------------- do delay--; while (delay != 0); return (int)(delay); } int delay_long (int){ //--------------------------------------- Delay lung------------------ int j; j = 100; do{ delay_time(delay); j--; }while (j != 0); return (int)(delay); } float convert_volt (float IntVolt){ // ------------------------Conversie tensiune float voltage,ua2,raport_divizor,r2,r1; r1 = 10000; r2 = 1000; ua2 = (3.44/1024*IntVolt); raport_divizor = ((r1+r2)/r2); voltage = (ua2*raport_divizor); return (float)(voltage); } float convert_cur (float IntCur){ // ------------------------Conversie curent float current,Usunt,factor_op_amp,r2_op,r1_op,rs; r1_op = 995; r2_op = 10050; rs = 0.028; factor_op_amp = (1+(r2_op/r1_op)); Usunt = ((3.44/1024*IntCur)/factor_op_amp); current = ((Usunt/rs)-0.03); if (current < 0.05) { current = 0; } return (float)(current); } void configure_lcd(int){ //-----------------------------LCD-SET-AND-CONFIGURE--------------------------------------- int rep_n; rep_n = 3; do{ strobe_data_p2(D5+D4); // comand xxxxx 110000 x3 means >> 8bit, 2lines, 5x8pixel char rep_n--; }while (rep_n != 0); rep_n = 2; do{ // comand xxxxx 100000 x1 means >> 8bit, 2lines, 5x8pixel char strobe_data_p2(D5); // comand xxxxxxxxxxxxxxx means >> move right/ shift off rep_n--; }while (rep_n != 0); strobe_data_p2(D7); // comand xxxxxxxxxxxxxxx means >> move right/ shift off strobe_data_p2(0x00); // comand xxxxxxxxxxxxxxx means >> move right/ shift off strobe_data_p2(D7+D6); // comand xxxxxxxxxxxxxxxx means >> move right/ shift off strobe_data_p2(0x00); // comand xxxxxxxxxxxxxxxx means >> display/ cursor/ blinking strobe_data_p2(D7+D6+D5+D4); // comand xxxxxxxxxxxxxxx means >> display/ cursor/ blinking rep_n = 2; do{ strobe_data_p2(0x00); // comand xxxxxxxxxxxxxx means >> 8bit, 2lines, 5x8pixel char strobe_data_p2(D4); // comand xxxxxxxxxxxxxx means >> 8bit, 2lines, 5x8pixel char rep_n--; }while (rep_n != 0); } float bucla_div_mod(float ref_temp_val){ //------------------------------ Loop for div/mod ------------ int tenths,units,decimal1,decimal2,decimal3; tenths = 0; units = 0; decimal1 = 0; decimal2 = 0; decimal3 = 0; i = 27; do{ // div_/mod_ loop if ( ref_temp_val >= 10 ){ ref_temp_val = ref_temp_val - 10; tenths = tenths + 1; } i--; }while (i != 0); i = 10; ref_temp_val = ref_temp_val*10; do{ // div_/mod_ loop if ( ref_temp_val >= 10 ){ ref_temp_val = ref_temp_val - 10; units = units + 1; } i--; }while (i != 0); i = 10; ref_temp_val = ref_temp_val*10; do{ // div_/mod_ loop if ( ref_temp_val >= 10 ){ ref_temp_val = ref_temp_val - 10; decimal1 = decimal1 + 1; } i--; }while (i != 0); i = 10; ref_temp_val = ref_temp_val*10; do{ // div_/mod_ loop if ( ref_temp_val >= 10 ){ ref_temp_val = ref_temp_val - 10; decimal2 = decimal2 + 1; } i--; }while (i != 0); i = 10; ref_temp_val = ref_temp_val*10; do{ // div_/mod_ loop if ( ref_temp_val >= 10 ){ ref_temp_val = ref_temp_val - 10; decimal3 = decimal3 + 1; } i--; }while (i != 0); array_div_mod[0] = tenths; array_div_mod[1] = units; array_div_mod[2] = decimal1; array_div_mod[3] = decimal2; array_div_mod[4] = decimal3; return (int)(array_div_mod); } void move_cursor_xy (int x,int y){ // ---------------------------- Procedura afisare------------ char adress,temp; x = x - 1; y = y - 1; adress = (128 + x + (64 * y)); //corectie la matrice temp = adress; P2OUT = Clear ; // R/W = 0 (write mode) RS = 0 (address) delay_time(delay); adress = adress >> 4; adress = adress << 2; strobe_data_p2(adress); adress = temp; adress &= 0x0F; adress = adress << 2; strobe_data_p2(adress); } void display_char(unsigned char ch){ //------------- Afisare Caracter------------------------ char temp; temp = ch; P2OUT = RS ; // R/W = 0 (write mode) RS = 1 (data) ch = ch >> 4; ch = ch << 2; strobe_data_p2(RS+ch); ch = temp; ch &= 0x0F; ch = ch << 2; strobe_data_p2(RS+ch); } int strobe_data_p2(int strobe){ // -------------------------- strobe data to display------------- P2OUT = (strobe); // data sent from comand delay_time(delay); P2OUT |= EN; // Enable = 1 delay_time(delay); P2OUT &= ~(EN); // Enable = 0 delay_time(delay); return(0); } int cls(int){ // -------------------------- Clear screen------------- int m; m = 16; move_cursor_xy(1,1); do{ display_char(' '); m--; }while (m != 0); m = 16; move_cursor_xy(1,2); do{ display_char(' '); m--; }while (m != 0); return(0); } int draw_Logo(int){ // -------------------- Logo intro------------- int count_m; cls(0); move_cursor_xy(4,1); display_char('C'); display_char('r'); display_char('e'); display_char('a'); display_char('t'); display_char('e'); display_char('d'); display_char(' '); display_char('b'); display_char('y'); move_cursor_xy(3,2); display_char('M'); display_char('a'); display_char('r'); display_char('i'); display_char('u'); display_char('s'); display_char(' '); display_char('T'); display_char('a'); display_char('c'); display_char('i'); display_char('u'); display_char('c'); move_cursor_xy(17,2); count_m = 6; do{ delay_long(0); count_m --; }while(count_m !=0); move_cursor_xy(4,1); //----------- Write Firmware version here display_char(' '); display_char(' '); display_char(' '); display_char(' '); display_char('A'); display_char('2'); display_char(' '); display_char(' '); display_char(' '); display_char(' '); move_cursor_xy(17,2); count_m = 1; do{ delay_long(0); count_m --; }while(count_m !=0); return(0); } int draw_sub_ps(int){ move_cursor_xy(1,1); display_char('V'); display_char('o'); display_char('l'); display_char('t'); display_char('a'); display_char('g'); display_char('e'); display_char(' '); display_char(' '); display_char('C'); display_char('u'); display_char('r'); display_char('r'); display_char('e'); display_char('n'); display_char('t'); move_cursor_xy(7,2); display_char('V'); move_cursor_xy(15,2); display_char('A'); move_cursor_xy(17,2); return(0); }